package recusive;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.stream.Collectors;
/*
给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。





 示例 1：


输入：digits = "23"
输出：["ad","ae","af","bd","be","bf","cd","ce","cf"]


 示例 2：


输入：digits = ""
输出：[]


 示例 3：


输入：digits = "2"
输出：["a","b","c"]




 提示：


 0 <= digits.length <= 4
 digits[i] 是范围 ['2', '9'] 的一个数字。


 Related Topics 哈希表 字符串 回溯 👍 2015 👎 0
*/

/**
 * @author luo
 * @description
 * @since 2022/7/21 19:15
 */
public class LetterCombinations {

    private static final Map<Integer, List<String>> MAP = new HashMap<>();

    @BeforeAll
    public static void init() {
        for (int i = 2; i <= 6; i++) {

            ArrayList<String> val = new ArrayList<>();
            int initNum = 'a' + (i - 2) * 3;
            for (int j = initNum; j < initNum + 3; j++) {
                val.add(String.valueOf((char) j));
            }
            MAP.put(i, val);
        }
        MAP.put(7, Arrays.asList("p", "q", "r", "s"));
        MAP.put(8, Arrays.asList("t", "u", "v"));
        MAP.put(9, Arrays.asList("w", "x", "y", "z"));

    }

    @DisplayName("电话号码的字母组合")
    @Test
    public void letterCombinations() {
//        MAP.entrySet().forEach(System.out::println);
        execute("238556").forEach(System.out::println);
    }

    public List<String> execute(String digits) {

        if (digits.length() == 1) {
            return MAP.get(Integer.valueOf(digits));
        }
        List<String> s2 = execute(digits.substring(1));
        List<String> s1 = MAP.get(Integer.valueOf(digits.substring(0, 1)));
        return s1.stream().flatMap(str1 -> {
            return s2.stream().map(str2 -> {
                return str1 + str2;
            });
        }).collect(Collectors.toList());

    }
}
